// //产生一个以微秒为周期的时钟信号clk_us，该信号可用于驱动一些需要精确时间控制的电路
module clk_div(
    input logic Clk,           // 输入系统时钟，50MHz
    input logic Rst_n,         // 输入复位信号，低电平有效
    
    output logic clk_us        // 输出微秒级时钟信号
);

    // 参数声明 1us = 1000ns = 50个时钟周期
    parameter int CNT_MAX = 19'd50;  //1us的计数值为 50 * Tclk（20ns）

    // 内部线网/寄存器声明
    logic [18:0] cnt;          // 定义一个19位的计数器
    logic add_cnt;             // 计数器使能信号
    logic end_cnt;             // 计数器结束信号，达到最大值时有效

    // 计数器的寄存器逻辑
    always_ff @(posedge Clk, negedge Rst_n) begin
        if (!Rst_n) begin       // 如果复位信号有效，则计数器清零
            cnt <= '0; 
        end
        else if (add_cnt) begin // 如果计数器达到最大值，则计数器重置
            if (end_cnt) begin
                cnt <= '0; 
            end
            else begin          // 否则计数器继续计数
                cnt <= cnt + 1'b1; 
            end
        end
        else begin
            cnt <= cnt;         // 如果计数器未使能，则保持当前值
        end
    end

    // 赋值计数器使能信号，始终使计数器有效
    assign add_cnt = 1'b1; 
    // 赋值计数器结束信号，当计数器使能并且计数值达到CNT_MAX - 1时有效
    assign end_cnt = add_cnt && cnt >= CNT_MAX - 19'd1;
    // 赋值输出时钟信号，当计数器达到最大值时输出一个脉冲
    assign clk_us = end_cnt;

endmodule